package com.cskaoyan._03memory;

/**
 * @description:
 * @author: 景天
 * @date: 2023/2/1 10:24
 **/
/*
从三个角度来分析这个问题

- 存储的类型
    1. 堆上存储的是new出来的东西，是引用数据类型的实质——对象。
    2. 栈上存储的是局部变量（基本数据类型和引用类型的引用）
- 默认值
1. 堆上对象中的变量具有默认值:
   1. 整形（byte、short、int、long）默认值为0
   2. 浮点类型（float、double）默认值为0.0
   3. 字符类型（char）默认值是'\u0000' 表示编码值为0的字符，一个绝对空字符。''
   4. 布尔类型（boolean）默认值是false
   5. 引用数据类型默认值是null
      - null既不是对象也不是任何一种数据类型，它仅是一个特殊的值
      - 任何引用数据类型的引用都可以指向null，指向null并不意味着没有初始化，
      可以认为引用指向了虚无，反正没有指向任何一个对象。
      - 对象才是引用数据类型的实质，没有指向对象的引用实际上没有任何意义，
      指向null的引用是无法正常使用的！
      - 基本数据类型不能等于null
2. 栈上的局部变量没有默认值，声明局部变量后必须显式的初始化，否则无法使用。
- 生命周期
1. 堆上的对象使用完毕后，随着方法的出栈，对象的引用就会被销毁。
这个时候对象就没有引用指向它，而是"孤零零"的单独存在于堆上，
这种对象意味着我们就无法再次使用它了，这种对象没有意义了。
在Java中，我们把这种对象称之为`垃圾`或者`垃圾对象`，它们会等待垃圾回收器进行内存回收。
   关于Java的垃圾回收机制（Garbage Collection简称GC）：
   - 堆上的对象变成`垃圾`后，并不是立刻就会被回收，而是需要GC通过一系列的算法来决定它是否被回收。
   标记清除算法,标记复制算法,标记整理算法,分代收集算法
   - Java的GC机制是全自动的，程序员几乎无法干涉和主动回收`垃圾`。主动System.gc()
   这一方面为Java程序员的开发节省了大量的精力（无需花费大量精力来管理堆内存），
   相比于C++的全手动回收`垃圾对象`，Java在GC机制上的创新是Java能够如此流行的重要原因之一。但另一方面，一旦GC这种机制出现问题，对Java而言将会是非常难以解决的问题。
   - 垃圾回收是Java和C++之间的一道围墙，墙外的人想进来，墙内的人却想出去。
    C++: 分配内存malloc() 释放内存free() --->内存泄漏
2. 栈上的局部变量的生命周期和栈帧保持一致。方法栈帧进栈后，局部变量开辟空间生效了，
方法出栈后，局部变量就被销毁了。
 */
public class Demo4 {
    public static void main(String[] args) {
        // 整型
        byte[] bytes = new byte[2];
        short[] shorts = new short[2];
        long[] longs = new long[2];

        // 浮点型
        double[] doubles = new double[2];
        float[] floats = new float[2];

        System.out.println("bytes[0] = " + bytes[0]);
        System.out.println("shorts[0] = " + shorts[0]);
        System.out.println("longs[0] = " + longs[0]);

        System.out.println("----浮点----");
        System.out.println("doubles[0] = " + doubles[0]);
        System.out.println("floats[0] = " + floats[0]);

        System.out.println("----字符型----");
        char[] chars = new char[2];
        System.out.println(chars[0]);
        // '\u0000' 0 绝对空字符  ''

        System.out.println("----布尔型----");
        boolean[] booleans = new boolean[2];
        System.out.println("booleans[0] = " + booleans[0]);


        // 引用类型的默认值
        String[] strings = new String[2];
        System.out.println("strings[0] = " + strings[0]);

        int[] arr = null;
        // 只能打印
        System.out.println(arr);
        // 使用有限
        // System.out.println(arr.length);

        int a = 1;
        // 基本数据类型不能等于null
        //int b = null;

    }
}
